import os
from flask import Flask
from pyngrok import ngrok
from threading import Thread
import time

# 1. 初始化 Flask 应用
app = Flask(__name__)
PORT = 5000 # 设定 Flask 服务的运行端口

@app.route('/')
def home():
    """本地服务的根路由，返回一个简单的问候语"""
    return "Hello from Flask! This is running on local port 5000."

@app.route('/test')
def test_route():
    """一个用于测试的子路由"""
    return "Route /test is working!"

def start_flask():
    """在后台线程中启动 Flask 服务"""
    # Flask 默认运行在 127.0.0.1:5000
    app.run(port=PORT, host='127.0.0.1', debug=False, use_reloader=False)

def main():
    """主函数：启动 Flask 并创建 ngrok 隧道"""
    print(f"--- 1. 启动 Flask 服务于 http://127.0.0.1:{PORT} ---")
    # 在单独的线程中启动 Flask，以免阻塞主程序
    flask_thread = Thread(target=start_flask)
    flask_thread.start()

    # 等待 Flask 启动完成
    time.sleep(2)
    
    # 替换为您自己的 ngrok 授权码
    ngrok_auth_token = "2xvl1u6E1u8CSPHttvE5rrhNLC3_7WppSEwxW7qtYvnHVfarp" 

    print(f"--- 正在配置 ngrok 授权码... ---")
    ngrok.set_auth_token(ngrok_auth_token)

    print("\n--- 2. 创建 ngrok 隧道 ---")
    # 使用 pyngrok 连接本地 5000 端口
    # 注意：如果您是第一次使用，可能需要配置 ngrok 授权码 (authtoken)
    # ngrok.set_auth_token("您的ngrok授权码") 
    
    try:
        # 创建 HTTP 隧道
        tunnel = ngrok.connect(PORT, proto="http")
        public_url = tunnel.public_url

        print(f"\n✅ ngrok 隧道创建成功！")
        print(f"公网访问地址 (Public URL): {public_url}")
        print(f"本地服务地址 (Local Address): {tunnel.uri}")
        print("---------------------------------------")
        print("隧道已启动。请在公网环境中测试访问。")
        print("按 Ctrl+C 停止。")
        print("---------------------------------------")

        # 保持主线程运行，直到接收到中断信号
        while True:
            time.sleep(1)

    except Exception as e:
        print(f"\n❌ ngrok 启动失败：{e}")
        print("请检查 ngrok 是否已安装或配置了授权码。")
        flask_thread.join() # 停止 Flask 线程
        
    finally:
        # 清理工作：关闭所有 ngrok 隧道
        print("\n--- 3. 清理并关闭 ngrok 隧道 ---")
        ngrok.kill()
        print("程序已退出。")
        os._exit(0) # 强制退出程序，包括后台线程

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        # 捕获 Ctrl+C，进行优雅退出
        print("\n用户中断，正在退出...")
        ngrok.kill()
        os._exit(0)